/*
 * @Author: jianfanfan 是是是
 * @Date: 2025-08-23 17:19:46
 * @LastEditors: jianfanfan 是是是
 * @LastEditTime: 2025-08-25 16:04:55
 * @FilePath: \dlabel-web-print\src\main\tsplPrinter.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import { SerialPort } from 'serialport'

export interface PrinterInfo {
  path: string
  manufacturer?: string
  serialNumber?: string
  pnpId?: string
  locationId?: string
  productId?: string
  vendorId?: string
}

export class TSPLPrinter {
  /**
   * 扫描串口打印机设备
   * @returns 打印机设备列表
   */
  static async scanPrinters(): Promise<PrinterInfo[]> {
    try {
      // 获取所有可用的串口
      const ports = await SerialPort.list()
      const printers: PrinterInfo[] = []

      // 过滤出可能的TSPL打印机设备
      for (const port of ports) {
        // 这里可以添加特定的过滤条件来识别TSPL打印机
        printers.push({
          path: port.path,
          manufacturer: port.manufacturer,
          serialNumber: port.serialNumber,
          pnpId: port.pnpId,
          locationId: port.locationId,
          productId: port.productId,
          vendorId: port.vendorId
        })
      }

      return printers
    } catch (error) {
      console.error('Error scanning printers:', error)
      return []
    }
  }

  /**
   * 发送打印指令到指定的打印机
   * @param portPath 串口路径
   * @param data 要发送的打印数据
   */
  static async print(portPath: string, data: string): Promise<boolean> {
    return new Promise((resolve, reject) => {
      const port = new SerialPort({
        path: portPath,
        baudRate: 9600, // 根据打印机规格设置波特率
        dataBits: 8,
        stopBits: 1,
        parity: 'none'
      }, (err) => {
        if (err) {
          console.error('Error opening port:', err)
          return reject(err)
        }

        // 发送打印数据
        port.write(data, (err) => {
          if (err) {
            console.error('Error writing to port:', err)
            port.close()
            return reject(err)
          }
          
          // 关闭串口
          port.close((err) => {
            if (err) {
              console.error('Error closing port:', err)
              return reject(err)
            }
            resolve(true)
          })
        })
      })
    })
  }
}
